perm filename ROM2.FAI[CMS,LCS]1 blob sn#291767 filedate 1977-07-07 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00011 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		.INSERT	ASMBL.FAI
C00003 00003	 BIT RATE GEN CODES
C00006 00004			JSR	SETBEE	INIT BEEHIVE I/O	3
C00008 00005		C3:	CMPI	"G"				2
C00010 00006	 TTY MODE	CHECK THIS OUT FIRST
C00013 00007	 PRINT ADDRESS/VAL 
C00015 00008	 INPUT FROM BEEHIVE
C00016 00009	 RESET BEEHIVE I/O
C00018 00010	 GET PC SUB
C00019 00011	 ROM INTER VECTS
C00020 ENDMK
C⊗;
	.INSERT	ASMBL.FAI
; RAM
	PCL:	0	;0
	PCH:	1	;1
	PS:	2	;2
	A:	376	;3

	X:	176	;4
	Y:	377	;5
	SP:	377	;6
	ONMIA:	377	;7

	BEES:	377	;10	OLD BEEHIVE STATUS
	OBEEC:	377	;11	DEFAULT BEEHIVE CONTROL WORD
	BEEB0:	377	;12
	BEEB1:	377	;13

	ADR:	377	;14
		377	;15
	VAL:	377	;16
	TFLG:	377	;17
	TMP:	377	;20
		377	;21
		111	;22  ← FF MARK

; ODT RAM & INTERUPT VECTORS
	LOC 1000

	IRQA:	REPEAT 3,{111↔}	;1000 - 1002
	IRQB:	REPEAT 2,{111↔}	;1003 - 1004
	
	NMIA:	REPEAT 3,{333↔}	;1005 - 1007
		377		;1010 ← FF MARK

; BIT RATE GEN CODES
;	0 = 0			10 = 9600
;	1 = 19.2K DON'T USE	11 = 4800
;	2 = 50			12 = 1800
;	3 = 75			13 = 1200
;	4 = 134.5		14 = 2400
;	5 = 200			15 = 300
;	6 = 600			16 = 150
;	7 = 2400		17 = 110

; EPROM STARTS HERE
	LOC 176274	;TOP 1K SHOULD BE 176000
;	LOC 176000
	BEEC ← 174100 ↔ BEED ← 174101	;BEEHIVE CONTROL AND I/O ADDRESS
	MODC ← 174120 ↔ MODD ← 174121	;MODEM CONTROL AND I/O ADDRESS
	BEEDEF←MODDEF←25	;BEEHIVE AND MODEM CONTROL DEFAULTS
	BBRDEF←MBRDEF←15	;BIT RATE DEFAULTS 15=300 (FASTER FOR BEE?)

	BBIT←20		;BREAK BIT

; BREAK OPCODE CHECK
	BRKCK:	STAZ	A	;SAVE A 		2
		PLA		;GET OLD PS		1
		PHA		;RESTORE STACK		1
		ANDI	BBIT	;			2
		BNE	BRKIN	;AND CK FOR BRK		2
		LDAZ	A	;			2
		JMPIN	IRQB	;ELSE JUMP @IRQB	3

	PTBL:	0		;			1
		20		;			1
		2		;			1

	VINIT:	JMP	BRKCK	;INTERUPT JMP CODE	3
		10		;			1
		2		;			1
		JMP	ODT	;			3

; RESET STARTS HERE
	RSTA:	LDAI	BEEDEF	;SETUP BEE CONTROL	2
		STAZ	OBEEC	;WORD DEFAULT		2
		LDAI	BBRDEF	;SETUP BRATE DEFAULT	2
		STAZ	BEEB0	;			2
		STAZ	BEEB1	;			2

		LDXI	2	;			2
	PLOOP:	LDAX	PTBL	;SETUP PC AND PS	3
		PHA		;			2
		DEX		;			1
		BPL	PLOOP	;			2

		LDXI	7	;			2
	JLOOP:	LDAX	VINIT	;SETUP INT VECT		3
		STAX	1000	;			3
		DEX		;			1
		BPL	JLOOP	;			2
		
; JUMP TO HERE FOR DDT AND SAVE EVERYTHING
	ODT:	STAZ	A	;SAVE A			2
	BRKIN:	LDA	NMIA	;			3
		STAZ	ONMIA	;SAVE NMIA AND FORCE	2
		LDAI	RTI	;RETURN FROM INTERUPT	2
		STA	NMIA	;ON NMI			3
		STXZ	X	;SAVE X			2
		STYZ	Y	;SAVE Y			2
		PLA		;			1
		STAZ	PS	;SAVE PS AND PC		2
		PLA		;			1
		STAZ	PCL	;			2
		STAZ	ADR	;SETUP ADDRESS		2
		PLA		;			1
		STAZ	PCH	;			2
		STAZ	ADR+1	;			2
		TSX		;			1
		STXZ	SP	;SAVE STACK PONITER	2
		CLD		;FORCE BINARY		1
		
		JSR	SETBEE	;INIT BEEHIVE I/O	3

	PLF:	LDAI	12	;PRINT LF		2
		JSR	PCHR	;			3
		
	PCR:	LDAI	15	;PRINT CR		2
		JSR	PCHR	;			3

		LDXI	0	;			2
		LDAIX	ADR	;GET CONTENTS		2
		STAZ	VAL	;			2
		JSR	PAV	;PRINT ADDRESS/VAL	3

		LDAI	" "	;PRINT SPACE		2
		JSR	PCHR	;			3

		STXZ	TMP	;X IS 0			2
		STXZ	TMP+1	;			2
		STXZ	TFLG	;			2

	NXTCHR:	JSR	GCHR	;WAIT TILL CHR		3
		ANDI	177	;STRIP TOP BIT		2
		JSR	PCHR	;ECHO IT		3

		CMPI	"↑"	;CHECK THIS		2
		BNE	C1	;			2
		LDAZ	ADR	;STEP BACK		2
		BNE	NOD	;			2
		DECZ	ADR+1	;			2
	NOD:	DECZ	ADR	;			2
		JMP	PLF	;			3

	C1:	CMPI	12	;LF			2
		BNE	C2	;			2
		LDAZ	TFLG	;STEP FORWARD		2
		BEQ	NODEP	;			2
		LDAZ	TMP	;DEPOSIT		2
		STAIX	ADR	;			2
	NODEP:	INCZ	ADR	;STEP			2
		BNE	PCR	;			2
		INCZ	ADR+1	;			2
		JMP	PCR	;			3

	C2:	CMPI	"/"	;			2
		BNE	C3	;			2
		LDAZ	TFLG	;CHECK FOR NEW ADDRESS	2
		BEQ	EROR	;NO ADDRESS		2
		LDAZ	TMP	;EXAMIN			2
		STAZ	ADR	;			2
		LDAZ	TMP+1	;			2
		STAZ	ADR+1	;			2
		JMP	PLF	;			3

	C3:	CMPI	"G"	;			2
		BNE	C4	;			2
		LDAZ	BBRDEF	;LEAVE DDT		2
		STA	BR0	;DEFAULT BIT RATE	3
		STA	BR0	;			3
		LDAZ	OBEEC	;			2
		STA	BEEC	;BEEHIVE CONTROL	3

		LDXZ	SP	;SETUP STACK		2
		TXS		;			1
		LDAZ	PCH	;			2
		PHA		;			1
		LDAZ	PCL	;			2
		PHA		;			1
		LDAZ	PS	;			2
		PHA		;			1
		LDXZ	X	;			2
		LDYZ	Y	;			2
		LDAZ	ONMIA	;FIX FIRST NMI BYTE	2
		STA	NMIA	;			3
		LDAZ	A	;			2
		RTI		;START PROGRAM		1

	C4:	CMPI	"T"	;CHECK FOR TTY MODE	2
		BEQ	TTY	;			2
		CMPI	"B"	;CHECK FOR BOOTSTRAP	2
		BEQ	BOOT	;			2
		CMPI	"L"	;CHECK FOR LOAD		2
		BEQ	BOOT	;			2

		CMPI	60	;CHECK FOR OCTAL NUM	2
		BCC	EROR	;			2
		CMPI	70	;			2
		BCS	EROR	;ERROR ON UNKNOWN	2

		LDXI	3	;NUMBER	OF BITS		2
	SLOOP:	ASLZ	TMP	;SHIFT TMP AND TMP+1	2
		ROLZ	TMP+1	;			2
		DEX		;			1
		BNE	SLOOP	;			2
		ANDI	7	;			2
		ORAZ	TMP	;STUFF IT AT BOTTOM	2
		STAZ	TMP	;			2
		INCZ	TFLG	;SET TMP FLAG		2
		BNE	NEXT	;			2

	EROR:	LDAI	7	;↑G 			2
		JSR	PCHR	;RING BELL		3
	NEXT:	JMP	NXTCHR	;			3

; TTY MODE	CHECK THIS OUT FIRST
	TTY:	JSR	SETMOD	;INIT MODEM		3
		JSR	SETNMI	;SETUP INTERUPT VECTOR	3

	TLOOP:	LDA	BEEC	;CKECK IF BEE TRANS	3
		ANDI	2	;REG IS EMPTY		2
		BEQ	NOB	;			2

		LDA	MODC	;CHECK MOD RECV		2
		LSRA		;FOR CHR		1
		BCC	NOB	;			2
		LDA	MODD	;GET CHR FROM MODEM	3
		STA	BEED	;OUTPUT TO BEE		3

	NOB:	LDA	MODC	;CHECK IF MOD TRANS	3
		ANDI 	2	;REG IS EMPTY		1
		BEQ	TLOOP	;			2

		LDA	BEEC	;CK MOD RECV		3
		LSRA		;FOR CHR		1
		BCC	TLOOP	;			2
		LDA	BEED	;GET CHR FROM BEE	3
		STA	MODD	;OUTPUT TO MODEM
		JMP	TLOOP	;			3

; BOOT STRAP
	BOOT:	PHA		;SAVE DDT CHR		1
		LDAI	20	;SET ADDRESS AT 1010	2
		STAZ	ADR	;			2
		LDAI	2	;			2
		STAZ	ADR+1	;			2
		JSR	SETMOD	;INIT MODEM ????	3
		JSR	SETNMI	;INIT INTERUPT VECTOR	3
		LDXI	0	;CKECK THIS		2
		LDAI	"↑"	;OUTPUT CHR TO 		2
		JSR	WMOD	;INIT BOOTSTRAP		3

	BOTLOP:	LDYI	1	;			2
	HALF:	JSR	RMOD	;GET CHR		3
		ANDI	177	;			2
		CMPI	"@"	;CHECK IF DONE		2
		BNE	DONE	;			2
		BCS	XBELL	;			2
		CMPI	60	;			2
		BCC	XBELL	;			2
		PHA		;SAVE CHR		1
		LDAI	5	;			2
		STA	BEED	;			3
		PLA		;			1

	LOADIT:	DEY		;CHECK IF FIRST		1
		BNE	NIBL	;			2
		ASLA		;SHIFT HALF WAY		1
		ASLA		;			1
		ASLA		;			1
		ASLA		;			1
		STAZ	TFLG	;SAVE TOP		2
		JMP	HALF	;			3

	NIBL:	ANDI	17	;			2
		ORAZ	TFLG	;ADD TOP		2
		STAIX	ADR	;STORE @ADR		2
		INCZ	ADR	;ADR ← ADR + 1		2
		BNE	BOTLOP	;NEXT			2
		INCZ	ADR+1	;			2
		BNE	BOTLOP	;			2

	DONE:	PLA		;			1
		CMPI	"L"	;			2
		BEQ	LOAD	;			2
		JMP	1020	;START ON BOOT		3
	LOAD:	JMP	PLF	;			3

	XBELL:	LDAI	7	;BELL (↑G)		2
		STA	BEED	;DON'T WAIT		3
		LDAI	0	;			2
		BEQ	LOADIT	;			2

; PRINT ADDRESS/VAL 
	PAV:	LDXI	1	;# OF CHRS		2
		STXZ	TFLG	;SET BIT MASK		2
		LDYI	2	;# OF BITS + C		2
		JSR	RLOOP	;PRINT 0 OR 1		3
		LDXI	5	;			2
		LDAI	7	;			2
		STAZ	TFLG	;			2
		JSR	CLOOP	;PRINT 5 NUMS, 0 - 7	3
		LDAI	"/"	;			2
		JSR	PCHR	;PRINT /		3
		LDXI	1	;			2
		LDYI	3	;BIT MASK AND	 	2
		STYZ	TFLG	;# OF BITS +1		2
		JSR	DLOOP	;PRINT 0 - 3		3
		LDXI	2	;			2
		LDAI	7	;			2
		STAZ	TFLG	;			2
		JSR	CLOOP	;PRINT 2 NUMS, 0 - 7	3
		RTS		;			1

	CLOOP:	LDYI	3	;FOR 3 BITS TO A NUM	2
	RLOOP:	ROLZ	VAL	;ROTATE ADR VAL		2
		ROLZ	ADR	;			2
		ROLZ	ADR+1	;			2
	DLOOP:	DEY		;			1
		BNE	RLOOP	;			2
		LDAZ	VAL	;GET NEXT NUMBER	2
		ANDZ	TFLG	;			2
		ORAI	60	;MAKE ASCII		2
		JSR	PCHR	;PRINT IT		3
		DEX		;			1
		BNE	CLOOP	;NEXT NUM		3
		RTS		;			1

; INPUT FROM BEEHIVE
	GCHR:	LDA	BEEC	;			3
		LSRA		;CHECK IF EMPTY		1
		BCC	GCHR	;			2
		LDA	BEED	;GET CHR		3
		RTS		;			1
; OUTPUT TO BEEHIVE
	PCHR:	PHA		;SAVE CHR		1
	WAIT:	LDA	BEEC	;			3
		ANDI	2	;CHECK IF FULL		2
		BEQ	WAIT	;			2
		PLA		;			1
		STA	BEED	;PRINT IT		3
		RTS		;			1

; INPUT FROM MODEM
	RMOD:	LDA	MODC	;			3
		LSRA		;CHECK IF EMPTY		1
		BCC	RMOD	;			2
		LDA	MODD	;GET CHR		3
		RTS		;			1
; OUTPUT TO MODEM
	WMOD:	PHA		;SAVE CHR		1
	FULL:	LDA	MODC	;			3
		ANDI	2	;CHECK IF FULL		2
		BEQ	FULL	;			2
		PLA		;			1
		STA	MODD	;OUTPUT IT 		3
		RTS		;			1

; RESET BEEHIVE I/O

	BR0 ← 174140 ↔ BR1 ← 174141	;BEE BRATE IN/OUT ADDR
	BR2 ← 174142 ↔ BR3 ← 174143	;MOD BRATE IN/OUT ADDR

	SETBEE:	LDA	BEEC	;SAVE OLD BEE STATUS	3
		STAZ	BEES	;			2
		LDAZ	BEEB0	;SETUP BEEHIVE BIT RATE	2
		STA	BR0	;CHANELS		3
		LDAZ	BEEB1	;SETUP BEEHIVE BIT RATE	2
		STA	BR1	;			3
		LDAI	3	;RESET ACIA		2
		STA	BEEC	;			3
		LDAI	BEEDEF	;SETUP DEFAULT BEE I/O	2
		STA	BEEC	;			3
		RTS		;			1

; RESET MODEM I/O
	SETMOD:	LDAI	MBRDEF	;			2
		STA	BR2	;SETUP BRATE CHANELS	3
		STA	BR3	;			3
		LDAI	3	;RESET ACIA		2
		STA	MODC	;			3
		LDAI	MODDEF	;SETUP DEFAULT MOD I/O	2
		STA	MODC	;			3
		RTS		;			1

; SETUP NMI INTERUPT VECTOR JUMP
	SETNMI:	LDXI	7	;			2
	ILOOP:	LDAX	IVJ	;BLT IVJ TO NMIA	3
		STAX	NMIA	;			3
		DEX		;			1
		BPL	ILOOP	;			2
		RTS		;			1

	IVJ:	LDAI	RTI	;			2
		STA	NMIA	;TURN OFF INT		3
		JMP	PLF	;			3

; GET PC SUB
	GETPC:	TSX		;			2
		LDAX	402	;ZERO PAGE + 1		3
		PHA		;			1
		LDAX	401	;			3
		PHA		;			1
		RTS		;			1

; 16 BIT ARITH
	ADD16:	TXS		;			1
		LDAX	406	;GET LOW		3
		CLC		;			1
		ADCX	404	;			3
		STAX	406	;			3
		LDAX	405	;GET HIGH		3
		ADCX	403	;			3
	FIXS:	STAX	405	;			3
		PLA		;			1
		STAX	403	;			3
		PLA		;			1
		STAX	404	;			3
		RTS		;			1

	SUB16:	TXS		;			1
		LDAX	406	;GET LOW		3
		SEC		;			1
		SBCX	404	;			3
		STAX	406	;			3
		LDAX	405	;GET HIGH		3
		SBCX	403	;			3
		JMP	FIXS	;			3

; ROM INTER VECTS
	LOC 200265
;	LOC 177772

	0

	NMIV:	5
		2
	RSTV:	30
		374
	IRQV:	0
		2

;	NMIV:	ABSO NMIA	;			2
;	RSTV:	ABSO RSTA	;			2
;	IRQV:	ABSO IRQA	;		       _2_
				;			6
END